// Copyright 2017 The Cockroach Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
// implied. See the License for the specific language governing
// permissions and limitations under the License.

package main

import (
	"fmt"
	"os"
	"strings"

	"github.com/pkg/errors"

	"github.com/cockroachdb/cockroach/pkg/sql/ir/irgen/analyzer"
	"github.com/cockroachdb/cockroach/pkg/sql/ir/irgen/codegen"
	"github.com/cockroachdb/cockroach/pkg/sql/ir/irgen/ir"
	"github.com/cockroachdb/cockroach/pkg/sql/ir/irgen/parser"
	"github.com/cockroachdb/cockroach/pkg/sql/ir/irgen/template"
)

func irgen() error {
	if len(os.Args) < 2 {
		return errors.Errorf("usage: %s template definitions...", os.Args[0])
	}
	var namedTypeses [][]ir.NamedType
	for _, name := range os.Args[2:] {
		f, err := os.Open(name)
		if err != nil {
			return err
		}
		defer f.Close()
		defs, err := parser.Parse(name, f)
		if err != nil {
			return err
		}
		namedTypes, err := analyzer.Analyze(defs)
		if err != nil {
			return err
		}
		namedTypeses = append(namedTypeses, namedTypes)
	}
	f, err := os.Open(os.Args[1])
	if err != nil {
		return err
	}
	defer f.Close()
	tmpl, err := template.Parse(f)
	if err != nil {
		return err
	}
	// First comment for github/Go; second for reviewable.
	// https://github.com/golang/go/issues/13560#issuecomment-277804473
	// https://github.com/Reviewable/Reviewable/wiki/FAQ#how-do-i-tell-reviewable-that-a-file-is-generated-and-should-not-be-reviewed
	if _, err := fmt.Printf("// Code generated by %s. DO NOT EDIT.\n// GENERATED FILE DO NOT EDIT\n",
		strings.Join(os.Args, " ")); err != nil {
		return err
	}
	return codegen.Generate(os.Stdout, tmpl, 1 /*numRefs*/, 2 /*numEnums*/, namedTypeses...)
}

func main() {
	if err := irgen(); err != nil {
		fmt.Fprintf(os.Stderr, "%s: %s\n", os.Args[0], err)
		os.Exit(1)
	}
}
